// 1.倒数算数
// function count(num) {
//   console.log(num);
//   if (num > 0) {
//     count(num - 1);
//   }
// }
// count(10);

// 2.斐波那契额数列 后一个数是前两个数的和 从第三个数开始算
//0 1 1 2 3 5 8
//1 2 3 4 5 6 7

/* function ratings(n) {
  // let res;
  if (n >= 1 && n < 3) {
    // 可以算出第一个 ratings(1)=0 和第二个的数 ratings(2)=1
    return n - 1;
  }
  // 算出第三个以上的数
  return ratings(n - 1) + ratings(n - 2);
} */

// console.log(ratings(10));

// 定义空数组存放每个算出的数列的值

//3.定义函数可以输出到当前位置的所有的斐波那契额数列值，且最后作为数组输出  根据输入的值作为数列的第几个值
//与定义的斐波那契额数列函数联系
/* function all(n) {
  // // 根据输入的值遍历出所有的数列的结果
  // for (let i = 1; i <= n; i++) {
  //   //  console.log(ratings(n));
  //   // 将每个数列的值加入到数组里
  //   arr.push(ratings(i));
  // }
  let arr = [1, 2, 1, 1, 1, 1, 1, 1, 1, 1];
  arr.length = n;

  // 使用map处理
  let newarr = arr.map((item, i) => {
    return (item = ratings(i + 1));
  });
  // 返回数组
  return newarr;
}
// 打印数组，输出数组形式的斐波那契额数列
console.log(all(10)); */

//4.map()不能处理空数组且不能改变原数组
// function num(n) {
//   let arr = [];
//   arr.length = 3;
//   let b = arr.map((item) => {
//     return (item = ratings(n));
//   });
//   return b;
// }
// console.log(num(5));

//5.斐波那契额数列处理： 老师的数列是从1开始的
/* function feibo(index) {
  // 2. 当 index 已经退到 1 或者 2 的时候, 就要停止, 自动返回 1
  if (index <= 2) {
    return 1;
  }
  // 1. 调用自身, 每一个斐波那契数列的值都等于前两个值的和
  return feibo(index - 1) + feibo(index - 2);
}
console.log(feibo(9)); */

//6.额外处理的一道题
/* function fn(n) {
  if (n == 1) {
    return 1;
  }
  return n * fn(n - 1);
}
console.log(fn(6)); */

// 上题的思路分析
//    n:     1    2     3    4     5       6
//  分析：    1   2*1   3*2  4*6   5*24   6*120
// 结果f(n)： 1    2     6   24    120
// 核心思路：将算出的结果参与下次运算
//  结论：    n*(n-1对应的值)
